package com.gitee.wsl.common.ui.theme.palette.colorspace.ansi


/**
 * ANSI 8-bit前景或背景色（即8位编码，共256种颜色（2^8） ）<br></br>
 *
 *  * 0-7：                        标准颜色（同ESC [ 30–37 m）
 *  * 8-15：                       高强度颜色（同ESC [ 90–97 m）
 *  * 16-231（6 × 6 × 6 共 216色）： 16 + 36 × r + 6 × g + b (0 ≤ r, g, b ≤ 5)
 *  * 232-255：                    从黑到白的24阶灰度色
 *
 *
 *
 * 来自Spring Boot
 *
 * @author Toshiaki Maki, Phillip Webb
 * @see .foreground
 * @see .background
 * @since 5.8.0
 */
class Ansi8BitColor private constructor(
    val prefix: String,
    /**
     * 获取颜色代码(0-255)
     *
     * @return 颜色代码(0 - 255)
     */
    override val code: Int
) : AnsiElement {

    /**
     * 构造
     *
     * @param prefix 前缀
     * @param code   颜色代码(0-255)
     * @throws IllegalArgumentException 颜色代码不在0~255范围内
     */
    init {
        require(code >= 0 && code <= 255, { "Code must be between 0 and 255" })
    }


    override fun equals(obj: Any?): Boolean {
        if (this == obj) {
            return true
        }
        if (obj == null || this::class!== obj::class) {
            return false
        }
        val other = obj as Ansi8BitColor
        return this.prefix == other.prefix && this.code == other.code
    }


    override fun hashCode(): Int {
        return this.prefix.hashCode() * 31 + this.code
    }


    override fun toString(): String {
        return this.prefix + this.code
    }

    companion object {
        private val PREFIX_FORE = "38;5;"
        private val PREFIX_BACK = "48;5;"

        /**
         * 前景色ANSI颜色实例
         *
         * @param code 颜色代码(0-255)
         * @return 前景色ANSI颜色实例
         */
        fun foreground(code: Int): Ansi8BitColor {
            return Ansi8BitColor(
                PREFIX_FORE,
                code
            )
        }

        /**
         * 背景色ANSI颜色实例
         *
         * @param code 颜色代码(0-255)
         * @return 背景色ANSI颜色实例
         */
        fun background(code: Int): Ansi8BitColor {
            return Ansi8BitColor(
                PREFIX_BACK,
                code
            )
        }
    }
}
